/***********************************************************************************
 * 文件名： hc32_base_uart.h
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		仅 HC32F005 系列拥有 base uart，它们是 UART0 UART1 ，其它型号MCU请使用 
 *  hc32_general_uart.h 。
 *      中断入口统一定义在 isr.c 中。
 * 修改记录：
 * 	2020/8/18: 初版。 刘言。
***********************************************************************************/
#ifndef _HC32_BASE_UART_H_
#define _HC32_BASE_UART_H_

#ifdef __cplusplus
 extern "C" {
#endif


#if (HC32_MCU_SERIES == HC32F005)


#include "mcu.h"


#define UART_PCLK    (F_PCLK*1000000UL)      // UART_PCLK 初始频率 HZ  

// #ifndef HC32_EXIST_CONFIG_FILE

// #define UART0_BAUD_RATE     9600        // 初始波特率 
// #define UART0_RIEN          0           // 1：开启接收中断；0：不开启
// #define UART0_EN_TXBUFF     1           // 1: 开启发送缓存（发送中断）；0：不开启。开启后发送数据只是填充缓存，不用死等。
//     #define UART0_TXBUFF_SIZE   128
// #define _UART0_USE_HALF_DUPLEX           // 定义表示使用半双工模式，不定义使用默认的全双工模式
//     #define _UART0_PIN_TX_MODE  WIRE_PIN_UART_TX_MODE   // IO口切换成发送模式。当UART支持硬件半双工自动切换收发时定义为空。
//     #define _UART0_PIN_RX_MODE  WIRE_PIN_UART_RX_MODE   // IO口切换成接收模式。当UART支持硬件半双工自动切换收发时定义为空。

// #define UART1_BAUD_RATE     9600        // 初始波特率 
// #define UART1_RIEN          0           // 1：开启接收中断；0：不开启
// #define UART1_EN_TXBUFF     1           // 1: 开启发送缓存；0：不开启。开启后发送数据可以不必死等。
//     #define UART0_TXBUFF_SIZE   128
// #define _UART1_USE_HALF_DUPLEX           // 定义表示使用半双工模式，不定义使用默认的全双工模式
//     #define _UART1_PIN_TX_MODE  WIRE_PIN_UART_TX_MODE   // IO口切换成发送模式。当UART支持硬件半双工自动切换收发时定义为空。
//     #define _UART1_PIN_RX_MODE  WIRE_PIN_UART_RX_MODE   // IO口切换成接收模式。当UART支持硬件半双工自动切换收发时定义为空。
// #endif


// 初始化，使用之前必须先初始化，需要在其它地方开启时钟门控和配置端口。
void Uart0_Init();

// 发送1个字节
void Uart0_SendByte(u8 c);

// 发送一串数据
void Uart0_Send(const u8 *buff, u16 Length);

// 设置波特率
void Uart0_SetBaud(u32 baud);

// 事件：通知 Uart0 驱动程序 “发送完成”，请务必在 Uart0 中断中调用，中断标志位未清除（需要ISR中清除）
// 在中断中调用示例：
// void UART0_IRQHandler()
// {
// #if (UART0_EN_TXBUFF == 1)
// 	if(Uart0_GetSentFlag())
// 	{
// 		Uart0_ClearSentFlag();
// 		Uart0_SendComplete();	// 通知 Uart0 驱动程序 “发送完成”
// 	}
// #endif
// }
void Uart0_SendComplete();

// 获取1个字节接收完毕标志
// true - 接收完毕
STATIC_FORCE_IN_LINE bool Uart0_GetRecivedFlag(){return M0P_UART0->ISR_f.RI;}

// 清除1个字节接收完毕标志
STATIC_FORCE_IN_LINE void Uart0_ClearRecivedFlag(){M0P_UART0->ICR_f.RICLR = 0;}

// 获取接收到的1个字节
STATIC_FORCE_IN_LINE u8 Uart0_GetRecivedbyte(){return M0P_UART0->SBUF;}

// 获取1个字节发送完毕标志
// true - 发送完毕
STATIC_FORCE_IN_LINE bool Uart0_GetSentFlag(){return M0P_UART0->ISR_f.TI;}

// 清除1个字节发送完毕标志
STATIC_FORCE_IN_LINE void Uart0_ClearSentFlag(){M0P_UART0->ICR_f.TICLR = 0;}




// 初始化，使用之前必须先初始化，需要在其它地方开启时钟门控和配置端口。
void Uart1_Init();

// 发送1个字节
void Uart1_SendByte(u8 c);

// 发送一串数据
void Uart1_Send(const u8 *buff, u16 Length);

// 设置波特率
void Uart1_SetBaud(u32 baud);

// 事件：通知 Uart1 驱动程序 “发送完成”，请务必在 Uart1 中断中调用，中断标志位未清除（需要ISR中清除）
// 在中断中调用示例：
// void UART1_IRQHandler()
// {
// #if (UART1_EN_TXBUFF == 1)
// 	if(Uart1_GetSentFlag())
// 	{
// 		Uart1_ClearSentFlag();
// 		Uart1_SendComplete();	// 通知 Uart1 驱动程序 “发送完成”
// 	}
// #endif
// }
void Uart1_SendComplete();

// 获取1个字节接收完毕标志
// true - 接收完毕
STATIC_FORCE_IN_LINE bool Uart1_GetRecivedFlag(){return M0P_UART1->ISR_f.RI;}

// 清除1个字节接收完毕标志
STATIC_FORCE_IN_LINE void Uart1_ClearRecivedFlag(){M0P_UART1->ICR_f.RICLR = 0;}

// 获取接收到的1个字节
STATIC_FORCE_IN_LINE u8 Uart1_GetRecivedbyte(){return M0P_UART1->SBUF;}

// 获取1个字节发送完毕标志
// true - 发送完毕
STATIC_FORCE_IN_LINE bool Uart1_GetSentFlag(){return M0P_UART1->ISR_f.TI;}

// 清除1个字节发送完毕标志
STATIC_FORCE_IN_LINE void Uart1_ClearSentFlag(){M0P_UART1->ICR_f.TICLR = 0;}


#endif


#ifdef __cplusplus
}
#endif


#endif
